package sh.orm.util;

import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

/**
 * 名称工具类
 * @author lqq
 * @date 2019/1/22
 */
@Slf4j
public abstract class NameUtil {



    /**
     * 转换成数据库的命名方式-下划线
     * @param str
     * @return
     */
    public static String convertHumpToUnderline(String str){
        StringBuilder sb = new StringBuilder(str.toLowerCase());

        Stack<Integer> stack = new Stack();
        List<Integer> upperPosition = new ArrayList<Integer>();
        // 从第二个开始检查，
        for(int i = 1 ; i < str.length(); i ++ ){
            if(Character.isUpperCase(str.charAt(i))){
                upperPosition.add(i);
                stack.push(i);
            }
        }
        int stackSize = stack.size();
        for(int j = 0 ; j < stackSize ; j ++){
            sb.insert(stack.pop(),"_");
        }

        //log.info("改变驼峰标识：{}为下划线：{}" , str , sb.toString());
        return sb.toString();
    }

    /**
     * 根据属性名获取get方法名
     * @param fieldName
     * @return
     */
    public static String getGetNameByFieldName(String fieldName){
        StringBuilder sb = new StringBuilder(fieldName);
        sb.setCharAt(0,Character.toUpperCase(sb.charAt(0)));
        sb.insert(0,"get");
        return sb.toString();
    }

    /**
     * 根据get方法返回对应的field
     * @param getName
     * @return
     */
    public static String getFieldByGetName(String getName) {
        StringBuilder sb = new StringBuilder(getName);
        sb.delete(0,3);
        sb.setCharAt(0,Character.toLowerCase(sb.charAt(0)));
        return sb.toString();
    }

    /**
     * 获取非代理对象的class的名字，如果不是代理对象名字，直接返回
     * 如： sh.model.Book$$EnhancerByCGLIB$$ab5e961e 变成：  sh.model.Book
     * @param className
     * @return
     */
    public static String getNoProxyName(String className) {
        int proxyBeginIndex = className.indexOf("$$EnhancerByCGLIB");
        if(proxyBeginIndex > 0){
            return className.substring(0, proxyBeginIndex);
        }
        return className;
    }
}
